--- -1 failed
--- 1 success

--- getLock key
local key = KEYS[1]
local requestId = KEYS[2]
local ttl = tonumber(KEYS[3])
-- 若锁不存在：则新增锁，并设置锁重入计数为1、设置锁过期时间
if (redis.call('exists', key) == 0) then
    redis.call('hset', key, requestId, 1);
    if (ttl > 0) then
            redis.call('pexpire', key, ttl);
    end;
    return 1;
end;

-- 若锁存在，且唯一标识也匹配：则表明当前加锁请求为锁重入请求，故锁重入计数+1，并再次设置锁过期时间
if (redis.call('hexists', key, requestId) == 1) then
    redis.call('hincrby', key, requestId, 1);
    if (ttl > 0) then
            redis.call('pexpire', key, ttl);
    end;
    return 1;
end;

-- 若锁存在，但唯一标识不匹配：表明锁是被其他线程占用，当前线程无权解他人的锁，直接返回-1表示加锁失败
return -1;